package com.hb.trade.server.project.proj.service;

import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.hb.core.pojo.enums.CommonTypeEnum;
import com.hb.core.pojo.project.proj.entity.*;
import com.hb.core.pojo.project.proj.enums.BidWayEnum;


import java.util.Collection;
import java.util.List;

/**
 * 项目信息表 服务类
 *
 * @author zhaojk
 * @since 2021-08-30
 */
public interface ProjectService extends IService<AbstractProject> {

    /**
     * 添加指定的项目信息
     * 不需要经过审核直接通过的那种
     *
     * @param project 项目信息
     * @param bidWay  项目类型枚举
     * @return
     */
    boolean insertProjectWithoutAudit(JSONObject project, BidWayEnum bidWay);

    /**
     * 项目列表的分页信息(带标段信息)
     *
     * @param query 查询条件
     * @return
     * @see BidWayEnum
     */
    IPage<AbstractProject> pageProjects(QueryProject query);

    /**
     * 项目列表的分页信息(带标段信息)
     *
     * @param query  查询条件
     * @param bidWay 项目类型
     * @return
     * @see BidWayEnum
     */
    IPage<AbstractProject> pageProjects(QueryProject query, BidWayEnum bidWay);

    /**
     * 查询指定的项目类型的项目
     *
     * @param projectId
     * @param bidWay
     * @return 返回子类对象
     */
    AbstractProject getByPrimaryKey(Long projectId, BidWayEnum bidWay);

    /**
     * 查询指定的项目类型的项目
     * 该方法会根据项目类型匹配实际的子类类型
     *
     * @param projectId
     * @return 返回子类对象
     */
    AbstractProject getByPrimaryKey(Long projectId);

    /**
     * 更新指定类型的项目信息
     *
     * @param project 项目实体, 其中bidWay字段不能为空
     * @return
     */
    boolean updateProjectById(AbstractProject project);

    /**
     * 编辑公告 更新项目信息
     *
     * @param project
     * @return boolean
     */
    boolean updateNoticeProjectRelevant(AbstractProject project);

    /**
     * 新增或更新项目信息
     *
     * @param project
     * @param fields
     * @return
     */
    boolean insertOrUpdateProject(AbstractProject project, Collection<String> fields);

    /**
     * 判断是否是邀请投标
     *
     * @param id
     * @return
     */
    boolean invitationFlag(Long id);

    /**
     * 判断是否需要报名
     *
     * @param id
     * @return
     */
    boolean signUpFlag(Long id);

    /**
     * 查询是否评审
     *
     * @param id
     * @return
     */
    boolean findReviewFlag(String id);

    /**
     * 获取指定项目的招标方式
     *
     * @param projectId
     * @return
     */
    CommonTypeEnum getCommonType(Long projectId);

    /**
     * 根据项目主键获取项目信息
     *
     * @param id
     * @return
     */
    BidProject getBidProjectById(Long id);

    /**
     * 根据标段Id查询项目信息
     *
     * @param sectionId
     * @return
     */
    AbstractProject getProjectBySectionId(Long sectionId);

    /**
     *
     * @Description: 查询未推送过的项目列表
     * @Author: zhongdl
     * @Date:2022/2/17 15:37
     * @return: {@link List< AbstractProject> }
     **/
    List<AbstractProject> listProjectAllFieldsDTO();

    /**
     *
     * @Description: 生成招标项目编号(目前只支持政府采购)
     * @Author: zhongdl
     * @Date:2022/2/21 11:35
     * @return: {@link String }
     **/
    String generateTenderProjectCode();

    /**
     * @Description: 根据项目ID删除项目(伪删除)
     *
     * @author yuezheng
     * @param id
     * @return java.lang.Boolean
     * @date 2022/6/30 16:24
     */
    Boolean deleteProjectById(Long id);
}
